#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>

//#define DEBUG

struct msg_buffer {
	int size; // 缓冲数据大小
    void* buffer; // 缓冲数据, .buffer = msg
    
};

struct msg_queue {
    struct msg_buffer** msg; // 缓冲数据
	char name[256];
    int size; // 队列大小，使用的时候给出稍大的size，可以减少进入内核态的操作
    int lget; // 取队列数据的偏移量
    int lput; // 放队列数据的偏移量
    int nData; // 队列中数据的个数,用来判断队列满/空
    int nFullThread; // 由于队列满而阻塞在put_queue的线程个数
    int nEmptyThread; // 由于队列空而阻塞在get_queue的线程个数
	pthread_mutex_t mux;
	pthread_cond_t cond_get, cond_put;
};

int init_queue(struct msg_queue *q, char *name, int maxsize);
void destroy_queue(struct msg_queue *q);
struct msg_buffer* get_queue(struct msg_queue *q);
void put_queue(struct msg_queue *q, struct msg_buffer* data);
void set_queue_name(struct msg_queue *q, char *name);
char *get_queue_name(struct msg_queue *q);